package com.controleFamiliar.action;

import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;

import com.controleFamiliar.enumeration.FormasPagamento;
import com.controleFamiliar.facade.CategoriaDespesaFacade;
import com.controleFamiliar.facade.DespesaFacade;
import com.controleFamiliar.form.DespesaForm;
import com.controleFamiliar.pojo.CategoriaDespesa;
import com.controleFamiliar.pojo.Despesa;
import com.controleFamiliar.pojo.Usuario;

public class DespesaAction extends DispatchAction{
	
	public static final String FORWARD = "editarDespesa";
		
	public ActionForward iniciarCadastroDespesa(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		DespesaForm formulario = (DespesaForm) form;
		//Caso haja algum erro retorna para a tela de cadastro
		String forward = FORWARD;
		formulario.limpar();
		try{
		CategoriaDespesaFacade facade = new CategoriaDespesaFacade();
		List<CategoriaDespesa> listaCategorias = facade.listarTodasCategorias();
		request.setAttribute("listaCategorias", listaCategorias);
		
		request.setAttribute("listaFormasPagamento", new ArrayList<FormasPagamento>(Arrays.asList(FormasPagamento.values())));
		
		DespesaFacade facade2 = new DespesaFacade();
		List<Despesa> listaDespesas = facade2.listarTodasDespesas();
		request.setAttribute("listaDespesas", listaDespesas);
		
		}catch(Exception e){
			throw e;
		}	
		return mapping.findForward(forward);
	}
	
	public void testarAjax(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		response.setHeader("Cache-Control", "no-cache");
        response.setHeader("Pragma", "no-cache");
        PrintWriter out = response.getWriter();
        Date currentTime= new Date();
        String message = String.format("Currently time is %tr on %tD.",currentTime, currentTime);
        out.print(message);
	}
	
	public ActionForward salvarDespesa(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		DespesaForm formulario = (DespesaForm) form;
		try{
		DespesaFacade facade = new DespesaFacade();
		CategoriaDespesaFacade categoriaFacade = new CategoriaDespesaFacade();
		
		Despesa despesa = this.preencherPOJO(formulario); 
		//validar permissão do usuário para essa função		
		Usuario usuario = (Usuario)request.getSession().getAttribute("usuario");
		
		despesa.setCodUsuario(Integer.parseInt(usuario.getCodUsuario().toString()));
		despesa.setCategoriaDespesa(categoriaFacade.obter(Integer.parseInt(formulario.getCodCategoriaDespesa())));
		
		facade.salvarDespesa(despesa);
		
		request.setAttribute("message", "Despesa salva com sucesso");
		}catch(Exception e){
			throw e;
		}	
		return this.iniciarCadastroDespesa(mapping, formulario, request, response);
	}
	
	/**
	 * Remove uma categoria previamente cadastrada.
	 * @param mapping
	 * @param form
	 * @param request
	 * @param response
	 * @return
	 * @throws Exception
	 */
	public ActionForward removerDespesa(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		DespesaForm formulario = (DespesaForm) form;		
		try{
		DespesaFacade facade = new DespesaFacade();
		facade.removerDespesa(Integer.parseInt(formulario.getCodDespesa()));
		request.setAttribute("message", "Despesa removida com sucesso");
		}catch(Exception e){
			throw e;
		}	
		return this.iniciarCadastroDespesa(mapping, formulario, request, response);
	}
	
	public ActionForward iniciarAlteracaoDespesa(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		DespesaForm formulario = (DespesaForm) form;
		Integer codDespesa = Integer.parseInt(formulario.getCodDespesa());
		formulario.limpar();
		//Caso haja algum erro retorna para a tela de cadastro
		String forward = FORWARD;
		try{
		CategoriaDespesaFacade facade = new CategoriaDespesaFacade();
		List<CategoriaDespesa> listaCategorias = facade.listarTodasCategorias();
		request.setAttribute("listaCategorias", listaCategorias);
		
		request.setAttribute("listaFormasPagamento", new ArrayList<FormasPagamento>(Arrays.asList(FormasPagamento.values())));
		
		DespesaFacade facade2 = new DespesaFacade();
		List<Despesa> listaDespesas = facade2.listarTodasDespesas();
		request.setAttribute("listaDespesas", listaDespesas);
		
		Despesa despesa = facade2.obterDespesa(codDespesa);
		
		preencherFormulario(formulario, despesa);
		}catch(Exception e){
			throw e;
		}	
		return mapping.findForward(forward);
	}
	
	private Despesa preencherPOJO(DespesaForm formulario) throws Exception{
		Despesa despesa = new Despesa();
		
		formulario.setValor(formulario.getValor().replace(",", "."));
		
		//Copiando as propriedades semelhantes em nome e tipo
		BeanUtils.copyProperties(despesa, formulario);
		
		despesa.setFormaPagamento(FormasPagamento.valueOf(Integer.parseInt(formulario.getFormaDePagamento())));
		
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
		despesa.setDataDespesa(sdf.parse(formulario.getDtDespesa()));
		
		return despesa;		
	}
	
	private void preencherFormulario(DespesaForm formulario, Despesa despesa) throws Exception{
		
		formulario.setDescricao(despesa.getDescricao());
		formulario.setCodCategoriaDespesa(despesa.getCategoriaDespesa().toString());
		formulario.setDtDespesa(despesa.getDataDespesa().toString());
//		formulario.setFormaDePagamento(despesa.getFormaPagamento().getValor());
		formulario.setValor(despesa.getValor().toString().replace(".", ","));
	}
	

}
